外观
2024年09月 GESP C++ 四级真题解析
一、单选题(每题2分,共30分)
选择题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | A | B | A | B | D | A | B | D | A | B | C | A | A | A | C |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 在 C++ 中,()正确定义了一个返回整数值并接受两个整数参数的函数。
A. int add(int a,int b) { return a + b;}
B. void add(int a, int b) { return a + b;}
C. int add(a,b){ return a + b;}
D. void add(int a, int b) { return a - b; }
查看解析
答案:A
考纲知识点: 函数定义语法
解析: A选项语法完整:返回类型int、参数列表(int,int)、函数体{return...}。B错在void无返回值却return。C缺少参数类型。D返回类型错误且功能不符。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 在 C++ 中,形参与实参的关系描述正确的是()。
A. 形参在函数调用时指定,实参在函数定义时传递
B. 形参在函数定义时指定,实参在函数调用时传递
C. 形参和实参可以互换
D. 形参和实参必须是完全相同的类型,不能有任何差异。
查看解析
答案:B
考纲知识点: 函数参数传递
解析: 形参出现在函数定义中,实参在调用时传入。两者类型需兼容而非完全相同,C/D错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 运行以下代码,屏幕上将输出()。
cpp
#include <iostream>
using namespace std;
int var = 100;
void function(){
int var = 200;
cout << var << endl;
cout << ::var << endl;
}
int main(){
cout << var << endl;
function();
var += 100;
cout << var << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A. 100 200100 200
B. 100 200100 300
C. 100 200 200 200
D. 100200200300
查看解析
答案:A
考纲知识点: 作用域与全局变量
解析: 局部var=200屏蔽全局,需用::var访问全局值。输出顺序:全局100→局部200→全局100→全局200(经+=100)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 运行下面代码,屏幕上输出是()。
cpp
int arr[3] = {24, 9, 7};
int* p = arr;
p++;
cout << *p << endl;1
2
3
4
2
3
4
A. 24
B. 9
C. 7
D. 不确定
查看解析
答案:B
考纲知识点: 指针算术
解析: 指针p初始指向arr[0],执行p++后指向arr[1],解引用输出9。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 运行下面代码片段的结果是()。
cpp
int x = 20;
int y = 24;
int* p = &x;
int* q = &y;
p = q;1
2
3
4
5
2
3
4
5
A. 将x赋值为24
B. 将y赋值为20
C. 将q指向x的地址
D. 将p指向y的地址
查看解析
答案:D
考纲知识点: 指针赋值
解析: p=q仅改变指针p的指向,使其与q同指向y,不涉及x、y值修改。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 在 C++ 中,()正确定义一个名为student的结构体,其中包含一个name字符数组和一个age整数。
A. struct student { char name[20]; int age;};
B. student struct { char name[20]; int age;};
C. student struct { string name; int age;};
D. struct student { char[20] name; int age;};
查看解析
答案:A
考纲知识点: 结构体定义
解析: A语法正确:struct关键字在前,成员顺序定义。B/C关键字顺序错误,D数组声明语法错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 在 C++ 中,()正确声明了一个3行4列的二维数组。
A. int arr[3,4];
B. int arr[3][4];
C. int arr[4][3];
D. int arr(3,4);
查看解析
答案:B
考纲知识点: 二维数组声明
解析: 二维数组用[行][列]形式,B符合。A用逗号错误,C行列颠倒,D括号错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 一个二维数组定义为int arr[3][4];(假设一个int变量占4个字节),则int arr[0]占用()个字节的内存。
A. 3
B. 4
C. 12
D. 16
查看解析
答案:D
考纲知识点: 数组内存布局
解析: arr[0]是含4个int的一维数组,共4×4=16字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 下面代码采用递推算法来实现整数n的阶乘,则横线上应填写()。
cpp
int factorial(int n){
int result = 1;
for(int i = 2; i <= n; i++){
//在此处填入代码
}
return result;
}1
2
3
4
5
6
7
2
3
4
5
6
7
A. result *= i;
B. result += i;
C. result *= result;
D. result += result;
查看解析
答案:A
考纲知识点: 递推与阶乘
解析: 阶乘需累乘,故result *= i正确完成n! = 1×2×...×n。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 在排序算法中,稳定性指的是()。
A. 排序后数据不会丢失
B. 排序后相同元素的相对顺序保持不变
C. 排序后数据不会被修改
D. 排序后数据的时间复杂度不变
查看解析
答案:B
考纲知识点: 排序稳定性
解析: 稳定性定义即相同键值元素排序前后相对次序不变。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 下面代码实现了冒泡排序函数,则横线上应填写()。
cpp
// 交换数组 arr 的第 i 个元素和第 j 个元素
void swap(vector<int> &arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
int bubble_sort(vector<int> &arr) {
for (int i = arr.size() - 1; i > 0; i--) {
bool flag = false; // 标志位
/* 在此处填入代码 */
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1); // 注意:原题误写为 swap(arr, i, j)
flag = true;
}
/* 填入代码结束 */
if (!flag)
break; // 此轮“冒泡”未交换任何元素
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A. for(int j = 0; j < arr.size() - 1; j++)
B. for(int j = arr.size() - 1; j > 0; j--)
C. for (int j = 0; j < i; j++)
D. for(int j = i - 1; j <= 0; j--)
查看解析
答案:C
考纲知识点: 冒泡排序实现
解析: 内层循环需遍历未排好序的部分0~i-1,并与j+1比较,故C正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 上一题算法的时间复杂度为()。
A. O(n^2)
B. O(2n)
C. O(1)
D. O(n)
查看解析
答案:A
考纲知识点: 时间复杂度分析
解析: 冒泡排序双重循环,最坏/平均复杂度均为O(n^2)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 下面代码实现了插入排序函数(升序),则横线上应填写()。
cpp
void insertion_sort(vector<int> &nums){
for(int i = 1; i < nums.size(); i++){
int base = nums[i], j = i - 1;
//在此处填入代码
nums[j + 1] = nums[j];
j--;
nums[j + 1] = base;
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. while(j >= 0 && nums[j] > base)
B. while(j > 0 && nums[j] > base)
C. while(j >= 0 && nums[j] < base)
D. while(j > 0 && nums[j] < base)
查看解析
答案:A
考纲知识点: 插入排序实现
解析: 需将base插入到左侧已排序区间,循环条件为j>=0且当前元素大于base,A正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 小杨用文件重定向实现在log.txt文件中输出日志,则下面横线上应填写()。
cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ofstream log_file("log.txt");
streambuf* original_cout = cout.rdbuf();
cout.rdbuf(log_file.rdbuf());
/* 在此处填入代码 */
cout.rdbuf(original_cout); // 恢复原始的标准输出缓冲区
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A. cout << "This output will go to the log file." << endl;
B. log_file << "This output will go to the log file." << endl;
C. cout >> "This output will go to the log file." >> endl;
D. log_file >> "This output will go to the log file." >> endl;
查看解析
答案:A
考纲知识点: 文件流重定向
解析: 已把cout重定向到文件,继续使用cout即可写入文件,A正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 运行下面的代码,屏幕上将输出()。
cpp
#include <iostream>
using namespace std;
int divide(int a, int b){
if(b == 0){
throw runtime_error("division by zero error");
}
return a / b;
}
int main(){
int x = 10;
int y = 0; // 设为 0 会导致除零错误
try{
int result = divide(x, y);
cout << "result:" << result << endl;
} catch(const runtime_error& e){
cout << "caught an exception: " << e.what() << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
A. division by zero error result: caught an exception:
B. result: caught an exception: division by zero error
C. caught an exception: division by zero error
D. division by zero error caught an exception: division by zero error
查看解析
答案:C
考纲知识点: 异常处理
解析: 除零抛出异常,被catch捕获并输出e.what(),格式为caught an exception: division by zero error。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | √ | √ | × | × | √ | × | × | × | × | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 代码int a = 10; int* p = &a;可以正确定义指针和初始化指针。
查看解析
答案:√
考纲知识点: 指针定义与初始化
解析: int* p = &a语法正确,将指针p初始化为指向变量a。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 在 C++ 中,引用传递允许函数修改传递给它的参数的值。
查看解析
答案:√
考纲知识点: 引用传递
解析: 引用参数是实参别名,函数内修改即修改原变量。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 指针的大小与其所指向的变量的数据类型的大小相同。
查看解析
答案:×
考纲知识点: 指针大小
解析: 指针大小固定(如4/8字节),与平台有关,与所指类型大小无关。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 二维数组的行的大小必须在定义时确定,列的大小可以动态变化。
查看解析
答案:×
考纲知识点: 二维数组定义
解析: 普通二维数组行列大小都需在编译时确定,只有动态数组或vector可运行时变化。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 递推算法通过逐步求解当前状态和前一个或几个状态之间的关系来解决问题。
查看解析
答案:√
考纲知识点: 递推思想
解析: 递推利用已知状态推导新状态,逐步得到最终解。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 选择排序是稳定的排序算法。
查看解析
答案:×
考纲知识点: 排序稳定性
解析: 选择排序交换元素时会改变相同元素的相对位置,故不稳定。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 插入排序的时间复杂度总是比冒泡排序低。
查看解析
答案:×
考纲知识点: 排序复杂度比较
解析: 两者最坏/平均复杂度均为O(n^2),插入排序在部分有序时更优,但“总是”说法错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 在 C++ 中,如果没有捕获到异常(没有匹配的catch块),程序会继续执行而不会终止。
查看解析
答案:×
考纲知识点: 异常处理
解析: 未捕获异常会调用std::terminate,程序终止。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 以下代码用递推法求斐波那契数列的第n项,时间复杂度为指数级。
cpp
int fibonacci(int n){
if(n == 0) return 0;
if(n == 1) return 1;
int f0 = 0, f1 = 1, current;
for(int i = 2; i <= n; i++){
current = f0 + f1; // F(n) = F(n-1) + F(n-2)
f0 = f1;
f1 = current;
}
return current;
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
查看解析
答案:×
考纲知识点: 复杂度分析
解析: 该实现为线性遍历,时间复杂度O(n),非指数级。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 执行下面 C++ 代码后,输出的是20。
cpp
int point(int* p){
return *p * 2;
}
int main(){
int a = 10;
int* p = &a;
*p = point(p);
cout << *p << endl;
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
查看解析
答案:√
考纲知识点: 指针与函数
解析: *p先为10,point返回20并赋回*p,故输出20。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(每题25分,共50分)
1. 黑白方块
题目描述
小杨有一个 n 行 m 列的网格图,其中每个格子要么是白色,要么是黑色。小杨想知道网格图中是否存在一个满足如下条件的子矩形:
- 子矩形由4行4列组成;
- 子矩形的第1行和第4行只包含白色格子;
- 对于子矩形的第2行和第3行,只有第1个和第4个格子是白色的,其余格子都是黑色的;
请你编写程序帮助小杨判断。
输入格式
第一行包含一个正整数 t,代表测试用例组数。
接下来是 t 组测试用例。对于每组测试用例,一共 n + 1 行。
第一行包含两个正整数 n, m,含义如题面所示。
之后 n 行,每行一个长度为 m 的01串,代表网格图第 i 行格子的颜色,如果为0,则对应格子为白色,否则为黑色。
输出格式
对于每组测试用例,如果存在,输出Yes,否则输出No。
样例输入1
text
2
4 5
00000
01100
01100
00000
5 5
00000
01100
01110
00001
011001
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
样例输出1
text
Yes
No1
2
2
样例解释1
满足条件的子矩形形如:
0000
0110
0110
00001
2
3
4
2
3
4
数据范围
对于全部数据,保证有 1 ≤ t ≤ 10, 1 ≤ n, m ≤ 100。
解题思路
查看解题思路
考纲知识点: 二维数组遍历、模式匹配
简化题意: 在01矩阵中查找是否存在一个4×4子矩阵,其第1、4行全0,第2、3行仅首尾为0其余为1。
样例解释:
- 样例1:存在左上角4×4区域满足条件,输出
Yes。 - 样例2:无4×4区域符合指定模式,输出
No。
解题思路:
- 预处理:把每行01串转成01二维数组。
- 枚举左上角:遍历所有可能的4×4子矩阵左上角
(i,j)。 - 检查模式:对子矩阵逐格比对,满足4条规则即返回
Yes。 - 全部枚举完仍未找到则输出
No。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int w[N][N];
int n, m;
int match[4][4];
bool check(int xa, int ya) {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (w[xa + i][ya + j] != match[i][j])
return false;
return true;
}
int main() {
// 初始化匹配模式
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
match[i][j] = 0;
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= 2; j++)
match[i][j] = 1;
int t;
cin >> t;
while (t--) {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
for (int j = 1; j <= m; j++)
w[i][j] = s[j - 1] - '0';
}
bool found = false;
for (int i = 1; i + 3 <= n; i++)
for (int j = 1; j + 3 <= m; j++)
if (check(i, j)) {
found = true;
break;
}
cout << (found ? "Yes" : "No") << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 区间排序
题目描述
小杨有一个包含 n 个正整数的序列 a。
小杨计划对序列进行多次升序排序,每次升序排序小杨会选择一个区间 [l, r](l ≤ r)并对区间内所有数字,即 a_l, a_{l+1}, ..., a_r 进行升序排序。每次升序排序会在上一次升序排序的结果上进行。
小杨想请你计算出多次升序排序后的序列。
输入格式
第一行包含一个正整数 n,含义如题面所示。
第二行包含 n 个正整数 a_1, a_2, ..., a_n,代表序列。
第三行包含一个正整数 q,代表排序次数。
之后 q 行,每行包含两个正整数 l_i, r_i,代表将区间 [l_i, r_i] 内所有数字进行升序排序。
输出格式
输出一行包含 n 个正整数,代表多次升序排序后的序列。
样例输入1
text
5
3 4 5 2 1
3
4 5
3 4
1 31
2
3
4
5
6
2
3
4
5
6
样例输出1
text
1 3 4 5 21
样例解释1
- 第一次升序排序后,序列为
[3,4,5,1,2] - 第二次升序排序后,序列为
[3,4,1,5,2] - 第三次升序排序后,序列为
[1,3,4,5,2]
数据范围
对于全部数据,保证有 1 ≤ n ≤ 100, 1 ≤ a_i ≤ 100, 1 ≤ q ≤ 100, 1 ≤ l_i ≤ r_i ≤ n。
解题思路
查看解题思路
考纲知识点: 区间排序、模拟
简化题意: 给定序列和多次区间升序排序请求,输出最终序列。
样例解释: 按顺序执行每次区间排序,注意每次排序基于上一次结果。
解题思路:
- 读入序列。
- 对每次查询
(l,r),使用sort或冒泡排序对区间[l,r]升序排序。 - 所有查询完成后输出序列。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N], n;
void bubbleSort(int l, int r) {
bool flag = true;
while (flag) {
flag = false;
for (int i = l; i < r; i++) {
if (a[i] > a[i + 1]) {
swap(a[i], a[i + 1]);
flag = true;
}
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int q;
cin >> q;
while (q--) {
int l, r;
cin >> l >> r;
bubbleSort(l, r);
}
for (int i = 1; i <= n; i++) {
cout << a[i];
if (i != n) cout << " ";
else cout << "\n";
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限